package io.github.weiranyi.topic;

import com.rabbitmq.client.*;
import io.github.weiranyi.utils.ConnectionUtil;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * @Description
 * @Return
 * @Author https://weiranyi.github.io
 * @Date Created in 2022-12-19 21:57
 **/
public class Receiver2 {
    static int count = 1;

    public static void main(String[] args) throws Exception {
        // 1.得到连接
        Connection connection = ConnectionUtil.getConnection();
        // 2.得到连接中的（信道）
        Channel channel = connection.createChannel();
        // 队列不存在则创建，存在则获取
        /**
         * arg0: 队列名称
         * arg1：数据是否持久化
         * arg2：是否排他（是否支持扩展，当前队列只能自己用，不能别人用）
         * arg3：是否自动删除（队列连接数为0时，队列会销毁，不管队列是否保存数据）
         * arg4：队列参数（没有就为null）
         */
        channel.queueDeclare("queueName2", true, false, false, null);
        // 7. 绑定路由
        channel.queueBind("queueName2","topicName","R1.#");
        // 6. 按劳分配 channel.basicQos(1); 表示快递一个一个送
        channel.basicQos(1); // 消费者端限流
        // 3.从信道中得到消息
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            // Delivery交付 handle处理（收件人信息，信封信皮，协议配置，消息）
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("蔚然1开始复习" + message + ",共复习了" + count++);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 5.2 ACK 手动签名(收件人信息，是否同时确认多个消息-false代表不会[一次只确认一个])
                channel.basicAck(envelope.getDeliveryTag(), false);

            }
        };
        // 4.监听队列（队列名，true[自动消息确认机制]，消费者）
        // 5.1 ACK true->false
        channel.basicConsume("queueName2", false, consumer);
    }
}
